#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ARRSIZE 10

typedef struct car
{
    char carname[20];
    int carprice;
} car_t;

typedef struct stack
{
    int top; 
    void *arr[ARRSIZE]; // 指向的数据是任意的。
} stack_t;

// 初始化
void initstack(stack_t *s);
// 出栈
int pop_stack(stack_t *s, car_t *value);
// 入栈
int push_stack(stack_t *s, car_t *value);
// 判断栈空   空:1   非空:0
int StackEmpty(stack_t *s);
// 判断栈满   满:1   非满:0
int StackFull(stack_t *s);

int main(int argc, char const *argv[])
{
    stack_t s;
    initstack(&s);

    car_t car1 = {"Xiaomi SU7", 21};
    car_t car2 = {"Tesla Model 3", 23};
    car_t car3 = {"BYD Han EV", 20};
    push_stack(&s, &car1);
    push_stack(&s, &car2);
    push_stack(&s, &car3);

    car_t dat;
    if (!pop_stack(&s, &dat))
        printf("车名:%s    \t价格:约%d万\n", dat.carname, dat.carprice);
    else
        printf("出栈失败\n");
    if (!pop_stack(&s, &dat))
        printf("车名:%s    \t价格:约%d万\n", dat.carname, dat.carprice);
    else
        printf("出栈失败\n");
    if (!pop_stack(&s, &dat))
        printf("车名:%s    \t价格:约%d万\n", dat.carname, dat.carprice);
    else
        printf("出栈失败\n");
    if (!pop_stack(&s, &dat))
        printf("车名:%s    \t价格:约%d万\n", dat.carname, dat.carprice);
    else
        printf("出栈失败\n");
    return 0;
}

// 初始化
void initstack(stack_t *s)
{
    s->top = -1;
    for (size_t i = 0; i < ARRSIZE; i++)
    {
        s->arr[i] = NULL;
    }

    return;
}
// 判断栈空   空:1   非空:0
int StackEmpty(stack_t *s)
{
    return s->top == -1;
}
// 判断栈满   满:1   非满:0
int StackFull(stack_t *s)
{
    return s->top == ARRSIZE - 1;
}
// 出栈
int pop_stack(stack_t *s, car_t *value)
{
    if (StackEmpty(s))
    {
        printf("stack is empty\n");
        return -1;
    }
    memcpy(value, s->arr[s->top], sizeof(car_t));
    s->top--;
    return 0;
}
// 入栈
int push_stack(stack_t *s, car_t *value)
{
    if (StackFull(s))
    {
        printf("stack is full\n");
        return -1;
    }

    car_t *new_car = (car_t *)malloc(sizeof(car_t));
    if (new_car == NULL)
    {
        printf("malloc failed\n");
        return -1;
    }

    memcpy(new_car, value, sizeof(car_t));
    s->arr[++s->top] = new_car;
    return 0;
}
